/**
 CommonJS 是一种用于 JavaScript 的模块化规范，最初是为在服务器端 JavaScript 环境（如 Node.js）中使用而设计的。它定义了如何在 JavaScript 中创建和使用模块，使得代码的组织和管理更加高效。以下是对 CommonJS 模块化的一些基本概念和总结说明。
  一、CommonJS 模块的基本概念
   1. 模块化
  模块化是将代码分割成独立的、可重用的部分（模块），每个模块都有自己的作用域。这种方式可以提高代码的可维护性和可读性，避免全局命名冲突。

   2. 导出与导入
  在 CommonJS 中，模块通过  `module.exports`  导出，其他模块通过  `require()`  导入。

  二、CommonJS 的使用
   1. 创建模块
  在一个 JavaScript 文件中，可以使用  `module.exports`  来导出变量、函数或对象。例如，创建一个名为  `math.js`  的模块：
  // math.js
  const add = (a, b) => a + b;
  const subtract = (a, b) => a - b;

  module.exports = {
      add,
      subtract
  };
   2. 导入模块

  在另一个 JavaScript 文件中，可以使用  `require()`  函数来导入刚刚创建的模块。例如，在  `app.js`  中导入  `math.js` ：
  // app.js
  const math = require('./math');

  console.log(math.add(2, 3)); // 输出: 5
  console.log(math.subtract(5, 2)); // 输出: 3
   3. 注意事项
  - 路径：在使用  `require()`  导入模块时，路径可以是相对路径（如  `./math` ）或绝对路径。
  - 文件扩展名：在 Node.js 中， `.js`  文件扩展名是可选的，但通常建议明确指定。

  三、CommonJS 的特点
  1. 同步加载：CommonJS 采用同步加载的方式，这在服务器端环境中是可以接受的，但在浏览器端可能会导致性能问题。
    
  2. 单一导出：每个模块只能导出一个对象，虽然可以将多个函数和变量组合成一个对象进行导出。

  3. 作用域隔离：每个模块都有自己的作用域，避免了全局命名冲突。

  4. 支持动态导入：可以在运行时根据条件动态导入模块。

  四、总结
  - CommonJS 是一种广泛使用的 JavaScript 模块化规范，主要用于 Node.js 环境。
  - 通过  `module.exports`  导出模块，使用  `require()`  导入模块，使得代码组织更加清晰。
  - CommonJS 的同步加载特性适合服务器端，但在浏览器端需要考虑性能问题。
  - 由于其简单性和有效性，CommonJS 成为许多 JavaScript 项目的模块化标准。
 */

  // 1. 直接获取导出的对象
  // const math = require('./02_utils.js');
  // console.log(math.UTILS, math.formatTime(), math.formatPrice());

  // 2. 解构赋值获取导出的对象
  // const { UTILS, formatTime, formatPrice } = require('./02_utils.js');
  // console.log(UTILS, formatTime(), formatPrice());

  // 3. 探讨require的本质
  const bar = require('./01_bar.js')
  console.log(bar.name);

  // 4s之后重新获取name
  // setTimeout(() => {
  //   console.log(bar.name)
  // }, 4000)

  // 2s之后通过bar修改了name
  // setTimeout(() => {
  //   bar.name = "bar修改了name"
  // }, 2000)
  
  
